package net.uman.framework.modules.utils;

import java.io.Serializable;
import java.math.BigDecimal;

/** */
/**
 * 金额类型. 支持自身的四则运算，并将this返回.
 */
public class Data implements Serializable {

	private BigDecimal value;

	/** */
	/**
	 * 提供默认精度10
	 */
	private int scale = 10;

	/** */
	/**
	 * double类型构造函数
	 * 
	 * @param value
	 */
	public Data(double value) {
		this.value = new BigDecimal(Double.toString(value));
	}

	public Data() {
		this(0);
	}
	
	/** */
	/**
	 * String类型构造函数
	 * 
	 * @param value
	 */
	public Data(String value) {
		this.value = new BigDecimal(value);
	}

	/** */
	/**
	 * 取得BigDecimal的值
	 * 
	 * @return
	 */
	public BigDecimal getValue() {
		return this.value;
	}

	/** */
	/**
	 * 两个double类型的数值相加
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public double add(double v1, double v2) {
		Data a1 = new Data(v1);
		Data a2 = new Data(v2);
		return add(a1, a2);
	}

	/** */
	/**
	 * 两数相除
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public double div(double v1, double v2) {
		Data a1 = new Data(v1);
		Data a2 = new Data(v2);
		return this.divide(a1, a2);
	}

	/** */
	/**
	 * 相减
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public double sub(double v1, double v2) {
		Data a1 = new Data(v1);
		Data a2 = new Data(v2);
		return this.subtract(a1, a2);
	}

	/** */
	/**
	 * 相乘
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public double mul(double v1, double v2) {
		Data a1 = new Data(v1);
		Data a2 = new Data(v2);
		return this.multiply(a1, a2);
	}

	/** */
	/**
	 * 两个Amount类型的数据进行相加
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public double add(Data v1, Data v2) {
		return v1.getValue().add(v2.getValue()).doubleValue();
	}

	/** */
	/**
	 * 两个Amount类型变量相除
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public double divide(Data v1, Data v2) {
		if (scale < 0) {
			throw new IllegalArgumentException("精度指定错误,请指定一个>=0的精度");
		}
		return v1.getValue().divide(v2.getValue(), scale,
				BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/** */
	/**
	 * 两数相乘
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public double multiply(Data v1, Data v2) {
		return v1.getValue().multiply(v2.getValue()).doubleValue();
	}

	/** */
	/**
	 * 两数相减
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public double subtract(Data v1, Data v2) {
		return v1.getValue().subtract(v2.getValue()).doubleValue();
	}

	/** */
	/**
	 * 返回value的浮点数值
	 * 
	 * @return
	 */
	public double doubleValue() {
		return this.getValue().doubleValue();
	}

	/** */
	/**
	 * 设置精度
	 * 
	 * @param scale
	 */
	public void setScale(int scale) {
		this.scale = scale;
	}	
}
